/*
 *  update_firmware.h
 *  Created on: 2023年2月21日
 *      Author: Lw
*/


#ifndef SRC_FW_UPDATE_UPDATE_FIRMWARE_H_
#define SRC_FW_UPDATE_UPDATE_FIRMWARE_H_
#include "xil_types.h"

#define MAX_COMPRESS_LEN (10*1024*1024)//定义最大接收到的压缩文件大小为3M

#define RECV_PACKAGE_DATA_MAX_LEN   (222) //定义每包中有效固件数据最大值

#define FIRMWARE_DEVICE_ID   0X01
#define FIRMWARE_DATA_ID     0X01
#define DEADPIEXL_DATA_ID               0X02            //像素坏点Mask

#define FIRMWARE_CURPACKAGEFN_INDEX     1
#define FIRMWARE_DEVICE_INDEX   		2
#define FIRMWARE_DATA_INDEX     		3
#define FIRMWARE_CURPACKAGE_INDEX     	4
#define FIRMWARE_TOTALPACKAGE_INDEX     6

#define FIRMWARE_FIRSTSEQ_PACKAGE         0x01

/* 定义升级的文件名  */
#define EMMC_UPDATE_FILE_NAME	"0:/BOOT.BIN"

/* 定义压缩固件文件名  */
#define EMMC_COMPRESS_FILE_NAME	"0:/BOOT_lzw.BIN"
/* 定义备份压缩固件文件名1  */
#define EMMC_COMPRESS_FILE1_NAME "0:/LZW1.BIN"
/* 定义备份压缩固件文件名2  */
#define EMMC_COMPRESS_FILE2_NAME "0:/LZW2.BIN"
/* 定义备份压缩固件文件名3  */
#define EMMC_COMPRESS_FILE3_NAME "0:/LZW3.BIN"

/* 当前接收到的包序号  */
//#define EMMC_CurPackageSeq_FILE_NAME "0:/CUR_PACKAGE_SEQ.TXT"
#define EMMC_ENDPackageSeq_FILE_NAME "0:/PAGSEQ.BIN"
/* 固件总包数  */
#define EMMC_TotalPackageNum_FILE_NAME "0:/PAGNUM.BIN"
/* 接收到的总的固件字节数  */
#define EMMC_TotalCompressDataLen_FILE_NAME "0:/DATALEN.BIN"
/* 当前接收到的包的状态  */
#define EMMC_TotalPackage_STATUS "0:/PAGSTUS.BIN"

#define RECV_PACKAGE_PACKAGE_MAX_NUM   50000 //定义接收最大包数
#define RECV_PACKAGE_CURRENT_DONE     0x02
#define RECV_PACKAGE_CURRENT_UNDONE   0x01


enum E_UPDATESTATE
{
	INIT = 0,
	RECV_DATA_DURING ,			//接收数据中
    EMMC_DATA_COMPARE_SUCCEED,  //固件数据比较成功，准备解压缩
    EMMC_WR_DATA_FAIL ,         //EMMC文件读写出错
    EMMC_DATA_COMPARE_FAIL ,    //三份备份的文件错误，两两不相等
	UNCOMPRESS_DATA_FAIL ,      //解压缩出错
	RECV_DATA_TERM ,            //接收固件数据终止
    UNCOMPRESS_DATA ,           //解压缩文件
    EMMC_DATA_COMPARE ,         //三份备份的固件数据比较
    RECV_DATA_BEGIN ,           //侦听到can总线来的更新固件数据包
    WRITE_DATA_DURING ,         //往emmc中写入接收到的接收到的一个包
	WRI_SUCCEED ,				//往emmc中写入固件数据成功
	RECV_DATA_PackageSN_FAIL,
	PIXEL_MASK_BEGIN,           //开始修改坏点Mask
};

typedef struct{
	u8  LastPackageSN;					    //上一次包中的帧序号
	u8  CurPackageSN;					    //当前包中的帧序号
	u16 CurPackageSeq;					    //当前接收到的包的序号
	u16 CurPackageSeqRelax;
	u16 EndPackageSeq;                      //当前接收所有包中包序号最大的包的包序号
	u16 TotalPackageNum;    			    //总的包的数量
	u16 RecvCrc16Data;                      //接收到的校验数
	u32 CompressDataLen;			        //接收到的压缩文件字节数
    u32 TotalCompressDataLen;               //总的接收到的压缩文件字节数
    u16 RecvPackageBuffLen;                 //接收到的数据长度
    u16 RecvPackageRelaxLen;                //接收到的数据长度
    u16 RecvPackageType;                                //接收到的数据类型 1：固件数据 2：像素Mask
	u8 RecvPackageStatus[RECV_PACKAGE_PACKAGE_MAX_NUM];//接收到的包的状态，值为RECV_PACKAGE_CURRENT_DONE表示当前包序号接收完成，为RECV_PACKAGE_CURRENT_UNDONE表示未完成
    u8 CompressPackBuffer[RECV_PACKAGE_DATA_MAX_LEN];  //接收到一包有效数据存放的地方
    u8 CompressPackRelax[RECV_PACKAGE_DATA_MAX_LEN];  //接收到一包有效数据缓存的地方
	u8 EmmcCompareData1[MAX_COMPRESS_LEN];  //读取emmc中备份固件数据1
    u8 EmmcCompareData2[MAX_COMPRESS_LEN];  //读取emmc中备份固件数据2
    u8 EmmcCompareData3[MAX_COMPRESS_LEN];	//读取emmc中备份固件数据3
	enum E_UPDATESTATE e_State ;
}S_tFirmwareUpdate;

S_tFirmwareUpdate s_FirmwareUpdate;

u8 updateFirmwareInit(void);
void updateFirmwareProcess(void);
void updateFirmwareTerm(void);
void beginUpdateFirmware(void);
void checkFirmwareData(void);

#endif /* SRC_UPDATE_FIRMWARE_H_ */
